#--
# Proyecto Único (Etapa 2)
# Analizador Sintáctico
# 
# Autores:
# (Grupo R07)
# César Hernández (06-39724)
# Daniel Valera (07-41725)
# 
# Versión: 0.1
#++
# = AST.rb
# Archivo que contiene la clase AST y las siguientes subclases de ella: 
# ASTStatement, ASTExpression y ASTBool.

# = class AST
# Clase compuesta por:
# <b>childs</b>:: Elementos del árbol.
class AST
  attr_reader :name
  
  # Inicializador de la clase.
  # <i>child</i>:: Elementos del árbol.
  def initialize(childs)
    @childs = childs
  end

  # Método que realiza la verificación del contexto estático del árbol.
  def check()
  
  end
  
  # Método que realiza la verificación dinámica e interpretación del árbol.
  def run()
  
  end
  
  # Método que devuelve una representación en cadena de caracteres del árbol.
  def to_s()
    return "_Árbol_\n#{@childs}\n"
  end
end

# = class ASTStatement
# Subárbol que almacena las declaraciones del lenguaje.
# Subclase compuesta por:
# <b>name</b>:: Nombre de la declaración.
# <b>child1, child2, child3</b>: Hijos del subárbol.
class ASTStatement < AST
  attr_reader :child1, :child2, :child3
  
  # Inicializador de la subclase.
  # <i>name</i>:: Nombre de la declaración.
  # <i>child1, child2, child3</i>: Hijos del subárbol.
  def initialize(name, child1, child2 = nil, child3 = nil)
    @name = name
    @child1 = child1
    @child2 = child2
    @child3 = child3
  end
  
  # Método que devuelve una representación en cadena de caracteres del subárbol.
  def to_s()
  #--
    @result = "#{@name} (" + child1.to_s
    
    # Se imprimen solo las variables no nulas.
    if (child2 != nil)
      @result += ", " + child2.to_s 
    end
    
    if (child3 != nil)
      @result += ", " + child3.to_s 
    end
    
    return @result + ")"
  #++
  end
end

# = class ASTExpression
# Subárbol que almacena las expresiones del lenguaje.
# Subclase compuesta por:
# <b>name</b>:: Nombre de la declaración.
# <b>child1, child2, child3</b>: Hijos del subárbol.
class ASTExpression < AST
  attr_reader :child1, :child2, :child3
  
  # Inicializador de la subclase.
  # <i>name</i>:: Nombre de la expresión.
  # <i>child1, child2, child3, child4</i>: Hijos del subárbol.
  def initialize(name, child1, child2 = nil, child3 = nil)
    @name = name
    @child1 = child1
    @child2 = child2
    @child3 = child3
  end
  
  # Método que devuelve una representación en cadena de caracteres del subárbol.
  def to_s()
  #--
    @result = "#{@name} (" + child1.to_s
    
    # Se imprimen solo las variables no nulas.
    if (child2 != nil)
      @result += ", " + child2.to_s 
    end
    
    if (child3 != nil)
      @result += ", " + child3.to_s 
    end
    
    return @result + ")"
  #++
  end
end

# = class ASTBool
# Subárbol que almacena las expresiones booleanas del lenguaje.
# Subclase compuesta por:
# <b>name</b>:: Nombre de la declaración.
# <b>child1, child2</b>: Hijos del subárbol.
class ASTBool < AST
  attr_reader :child1, :child2
  
  # Inicializador de la subclase.
  # <i>name</i>:: Nombre de la expresión booleana.
  # <i>child1, child2</i>: Hijos del subárbol.
  def initialize(name, child1, child2 = nil)
    @name = name
    @child1 = child1
    @child2 = child2
  end
  
  # Método que devuelve una representación en cadena de caracteres del subárbol.
  def to_s()
  #--
    @result = "#{@name} (" + child1.to_s
    
    # Se imprimen solo las variables no nulas.
    if (child2 != nil)
      @result += ", " + child2.to_s 
    end
    
    return @result + ")"
  #++
  end
end

################################################################################
# Este es el cambio que había propuesto para los defines
################################################################################

class ASTDeclaration < AST
  attr_reader :name, :parmlist, :type, :inst
  
  def initialize(kind, name, parmlist, type, inst)
    @kind = kind
    @name = name
    @parmlist = parmlist
    @type = type
    @inst = inst
  end
  
  def to_s()
    return "#{@kind} (Name #{@name}, ParmList " + @parmlist.to_s + ", Type #{@type}, Inst #{@inst})"
  end
end

################################################################################
# Subclases no utilizadas en la versión actual del parser
################################################################################

class ASTData < AST
  attr_reader :value
  
  def initialize(type, value)
    @type = type
    @value = value
  end
  
  def to_s()
    return "#{@type} #{@value}"
  end
end

class ASTList < AST
  attr_reader :list
  
  def initialize()
    @list = Array.new()
  end
  
  def insert(elem)
    @list.push(elem)
  end
  
  def to_s()
    return @list.join(", ")
  end
end

class ASTParam < AST
  attr_reader :id, :type
  
  def initialize(id, type)
    @id = id
    @type = type
  end
  
  def to_s()
    return "(Variable #{@id}, Type #{@type})"
  end
end

